--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / components / auth / AuthPage.vue
Displaying Raw • Download
meshchatx/src/frontend/components/auth/AuthPage.vue 23dbe7b7893320761e14aaf1ccc36d1c75c78596 (23dbe7b7) Text, 6.16 KB
Tb4b4b4<Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"h-screen w-full flex items-center justify-center bg-slate-50 dark:bg-zinc-950"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-full max-w-md p-8"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"bg-white dark:bg-zinc-900 rounded-2xl shadow-lg border border-gray-200 dark:border-zinc-800 p-8"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-center mb-8"Tb4b4b4>
Tb4b4b4<Tff7b72img Te6edf3classTff7b72=Ta5d6ff"w-16 h-16 mx-auto mb-4" Te6edf3srcTff7b72=Ta5d6ff"/assets/images/logo.png" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72h1 Te6edf3classTff7b72=Ta5d6ff"text-2xl font-bold text-gray-900 dark:text-zinc-100 mb-2"Tb4b4b4>
Tff7b72{{ Te6edf3isSetup Tff7b72? Ta5d6ff"Initial Setup" Tff7b72: Ta5d6ff"Authentication Required" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72h1Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-600 dark:text-zinc-400"Tb4b4b4>
Tff7b72{{
Te6edf3isSetup
Tff7b72? Ta5d6ff"Set an admin password to secure your MeshChat instance"
Tff7b72: Ta5d6ff"Please enter your password to continue"
Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72form Te6edf3classTff7b72=Ta5d6ff"space-y-6" Tb4b4b4@Te6edf3submitTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3handleSubmitTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3forTff7b72=Ta5d6ff"password" Te6edf3classTff7b72=Ta5d6ff"block text-sm font-medium text-gray-700 dark:text-zinc-300 mb-2"Tb4b4b4>
Password
Tb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3idTff7b72=Ta5d6ff"password"
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3passwordTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"password"
Te6edf3required
Te6edf3minlengthTff7b72=Ta5d6ff"8"
Te6edf3classTff7b72=Ta5d6ff"w-full px-4 py-2 border border-gray-300 dark:border-zinc-700 rounded-lg bg-white dark:bg-zinc-800 text-gray-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
Te6edf3placeholderTff7b72=Ta5d6ff"Enter password"
Te6edf3autocompleteTff7b72=Ta5d6ff"current-password"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isSetupTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"mt-2 text-xs text-gray-500 dark:text-zinc-500"Tb4b4b4>
Password must be at least 8 characters long
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isSetupTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3forTff7b72=Ta5d6ff"confirmPassword"
Te6edf3classTff7b72=Ta5d6ff"block text-sm font-medium text-gray-700 dark:text-zinc-300 mb-2"
Tb4b4b4>
Confirm Password
Tb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3idTff7b72=Ta5d6ff"confirmPassword"
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3confirmPasswordTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"password"
Te6edf3required
Te6edf3minlengthTff7b72=Ta5d6ff"8"
Te6edf3classTff7b72=Ta5d6ff"w-full px-4 py-2 border border-gray-300 dark:border-zinc-700 rounded-lg bg-white dark:bg-zinc-800 text-gray-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
Te6edf3placeholderTff7b72=Ta5d6ff"Confirm password"
Te6edf3autocompleteTff7b72=Ta5d6ff"new-password"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3errorTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg"
Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-sm text-red-800 dark:text-red-200"Tb4b4b4>Tff7b72{{ Te6edf3error Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"submit"
Tb4b4b4:Te6edf3disabledTff7b72=Ta5d6ff"Te6edf3isLoading Tff7b72|| Tb4b4b4(Te6edf3isSetup Tff7b72&& Te6edf3password Tff7b72!== Te6edf3confirmPasswordTb4b4b4)Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"w-full py-2.5 px-4 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed text-white font-semibold rounded-lg transition-colors"
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isLoadingTa5d6ff"Tb4b4b4>Processing...Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-elseTb4b4b4>Tff7b72{{ Te6edf3isSetup Tff7b72? Ta5d6ff"Set Password" Tff7b72: Ta5d6ff"Login" Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72formTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72scriptTb4b4b4>
Tff7b72export Tff7b72default Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"AuthPage"Tb4b4b4,
Te6edf3dataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3passwordTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3confirmPasswordTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3errorTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3isLoadingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3isSetupTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3mountedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3checkAuthStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3methodsTff7b72: Tb4b4b4{
Tff7b72async Te6edf3checkAuthStatusTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"/api/v1/auth/status"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3status Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3statusTb4b4b4.Te6edf3auth_enabledTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"/"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3statusTb4b4b4.Te6edf3authenticatedTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"/"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isSetup Tff7b72= Tff7b72!Te6edf3statusTb4b4b4.Te6edf3password_setTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to check auth status:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3error Tff7b72= Ta5d6ff"Failed to check authentication status"Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3handleSubmitTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3error Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isSetupTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3password Tff7b72!== Tff7b72thisTb4b4b4.Te6edf3confirmPasswordTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3error Tff7b72= Ta5d6ff"Passwords do not match"Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3passwordTb4b4b4.Te6edf3length Tff7b72< T79c0ff8Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3error Tff7b72= Ta5d6ff"Password must be at least 8 characters long"Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isLoading Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3endpoint Tff7b72= Tff7b72thisTb4b4b4.Te6edf3isSetup Tff7b72? Ta5d6ff"/api/v1/auth/setup" Tff7b72: Ta5d6ff"/api/v1/auth/login"Tb4b4b4;
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Te6edf3endpointTb4b4b4, Tb4b4b4{
Te6edf3passwordTff7b72: Tff7b72thisTb4b4b4.Te6edf3passwordTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3reloadTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3error Tff7b72= Te6edf3eTb4b4b4.Te6edf3responseTff7b72?Tb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3error Tff7b72|| Ta5d6ff"Authentication failed"Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3password Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3confirmPassword Tff7b72= Ta5d6ff""Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isLoading Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────